<?php
// 设置错误报告
ini_set('display_errors', 0);
error_reporting(0);

$waitTime = 30;
// 定义文件存储目录和删除标记目录
$aaDir = __DIR__ . DIRECTORY_SEPARATOR . 'aa';
$deleteMarkerDir = __DIR__ . DIRECTORY_SEPARATOR . 'deletemarkers';

// 确保目录存在
if (!is_dir($aaDir)) {
    header('HTTP/1.1 500 Internal Server Error');
    exit;
}

// 确保deletemarkers目录存在
if (!is_dir($deleteMarkerDir)) {
    mkdir($deleteMarkerDir, 0777, true);
}

// 第一步：检查并处理待删除的文件
$currentTime = time();
$markerFiles = glob($deleteMarkerDir . DIRECTORY_SEPARATOR . '*.json');

foreach ($markerFiles as $markerFile) {
    try {
        // 检查标记文件是否存在并可读
        if (file_exists($markerFile) && is_readable($markerFile)) {
            $content = file_get_contents($markerFile);
            if ($content) {
                $info = json_decode($content, true);
                if (isset($info['file_path']) && isset($info['delete_time'])) {
                    // 检查是否到达删除时间
                    if ($currentTime >= $info['delete_time']) {
                        // 删除目标文件
                        if (file_exists($info['file_path'])) {
                            @unlink($info['file_path']);
                        }
                        // 删除标记文件（清空删除记录）
                        @unlink($markerFile);
                    }
                }
            }
        }
    } catch (Exception $e) {
        // 忽略错误，继续处理下一个文件
    }
}

// 第二步：获取aa文件夹中的所有有效文件
$files = array_diff(scandir($aaDir), array('.', '..'));

// 过滤出实际文件（排除子目录）
$validFiles = [];
foreach ($files as $file) {
    $filePath = $aaDir . DIRECTORY_SEPARATOR . $file;
    if (is_file($filePath)) {
        $validFiles[] = $file;
    }
}

// 如果没有文件，返回404
if (empty($validFiles)) {
    header('HTTP/1.1 404 Not Found');
    exit;
}

// 按文件名排序（尝试按数字排序）
usort($validFiles, function($a, $b) {
    // 尝试提取文件名中的数字进行排序
    preg_match('/\d+/', $a, $matchesA);
    preg_match('/\d+/', $b, $matchesB);
    
    $numA = isset($matchesA[0]) ? (int)$matchesA[0] : PHP_INT_MAX;
    $numB = isset($matchesB[0]) ? (int)$matchesB[0] : PHP_INT_MAX;
    
    if ($numA !== PHP_INT_MAX && $numB !== PHP_INT_MAX) {
        return $numA - $numB;
    }
    
    // 如果无法提取数字，按字母顺序排序
    return strcmp($a, $b);
});

// 获取第一个文件
$firstFile = $validFiles[0];
$filePath = $aaDir . DIRECTORY_SEPARATOR . $firstFile;

// 清理输出缓冲区
while (ob_get_level()) {
    ob_end_clean();
}

// 设置下载响应头
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . rawurlencode($firstFile) . '"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filePath));

// 输出文件内容（这是主流程）
readfile($filePath);

// 强制刷新输出缓冲，确保客户端能收到完整文件
while (@ob_end_flush());
flush();

// 核心优化：使用PHP的pcntl扩展或其他异步机制实现非阻塞删除
// 方法1：使用信号处理 - 最佳方案，真正非阻塞
// 立即设置文件删除标记，不阻塞主进程
$deleteInfoFile = $deleteMarkerDir . DIRECTORY_SEPARATOR . 'delete_' . md5($filePath . time()) . '.json';

// 保存删除信息：文件路径和删除时间（当前时间+5秒）
$deleteInfo = json_encode([
    'file_path' => $filePath,
    'delete_time' => time() + $waitTime
]);
file_put_contents($deleteInfoFile, $deleteInfo);

// 关键部分：使用PHP的异步机制启动删除检查器
// 1. 优先尝试使用proc_open + stream_select实现真正的非阻塞启动
$cleanupCode = function() use ($deleteMarkerDir) {
    // 读取所有删除标记文件并处理已到期的标记
    $markerFiles = glob($deleteMarkerDir . DIRECTORY_SEPARATOR . '*.json');
    $currentTime = time();
    
    foreach ($markerFiles as $markerFile) {
        try {
            // 检查标记文件是否存在并可读
            if (file_exists($markerFile) && is_readable($markerFile)) {
                $content = file_get_contents($markerFile);
                if ($content) {
                    $info = json_decode($content, true);
                    if (isset($info['file_path']) && isset($info['delete_time'])) {
                        // 检查是否到达删除时间
                        if ($currentTime >= $info['delete_time']) {
                            // 删除目标文件
                            if (file_exists($info['file_path'])) {
                                @unlink($info['file_path']);
                            }
                            // 删除标记文件（清空删除记录）
                            @unlink($markerFile);
                        }
                    }
                }
            }
        } catch (Exception $e) {
            // 忽略错误，继续处理下一个文件
        }
    }
};

// 尝试使用多进程方式
if (function_exists('pcntl_fork')) {
    // Linux/Unix环境下的最佳方案
    $pid = pcntl_fork();
    if ($pid == -1) {
        // 创建子进程失败，使用备选方案
        register_shutdown_function($cleanupCode);
    } elseif ($pid) {
        // 父进程 - 立即退出，不阻塞主请求
        exit(0);
    } else {
        // 子进程 - 关闭所有标准文件描述符
        if (posix_setsid() === -1) {
            exit(1);
        }
        
        // 关闭所有文件描述符
        fclose(STDIN);
        fclose(STDOUT);
        fclose(STDERR);
        
        // 休眠5秒，与删除标记时间一致
        sleep(5);
        
        // 执行清理操作
        $cleanupCode();
        
        // 子进程退出
        exit(0);
    }
} elseif (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    // Windows环境下的非阻塞方案
    // 使用COM对象（如果可用）实现非阻塞
    if (class_exists('COM')) {
        try {
            $shell = new COM('WScript.Shell');
            // 创建一个简单的VBS脚本命令
            $vbsCode = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"
                     . "WScript.Sleep 5000\n"
                     . "If objFSO.FileExists(\"" . addslashes($filePath) . "\") Then\n"
                     . "    objFSO.DeleteFile \"" . addslashes($filePath) . "\", True\n"
                     . "End If\n"
                     . "If objFSO.FileExists(\"" . addslashes($deleteInfoFile) . "\") Then\n"
                     . "    objFSO.DeleteFile \"" . addslashes($deleteInfoFile) . "\", True\n"
                     . "End If";
            
            // 创建临时VBS文件
            $vbsFile = $deleteMarkerDir . DIRECTORY_SEPARATOR . 'delete_' . time() . '.vbs';
            file_put_contents($vbsFile, $vbsCode);
            
            // 非阻塞执行VBS脚本
            $shell->Run('cscript "' . $vbsFile . '"', 0, false);
        } catch (Exception $e) {
            // COM不可用，使用备选方案
            register_shutdown_function($cleanupCode);
        }
    } else {
        // 最后的备选方案
        register_shutdown_function($cleanupCode);
    }
} else {
    // 通用备选方案 - 使用系统调用但不等待完成
    $cmd = 'sleep 5 && rm -f "' . addslashes($filePath) . '" "' . addslashes($deleteInfoFile) . '" 2>/dev/null';
    exec($cmd . ' > /dev/null 2>&1 &');
}

// 立即退出当前脚本，确保不阻塞其他请求
exit(0);
?>